package game
import (
	"message"
	"github.com/name5566/leaf/log"
	"github.com/golang/protobuf/proto"
)



// 玩家登录成功
func (self *User) onLogin() {
	self.onInit()
}

// 玩家登出成功
func (self *User) onLogout() {
	// 通知客户端登出成功
	self.SendMsg(message.MSG_LOGOUT, nil)

	// 处理游戏逻辑
	self.reqStopGame()
}

// c-s 获取玩家数据
func (self *User) reqUserInfo() {
	log.Debug("xxxxxxxxxxxxxxxxx:  %v", self.getUserInfo())
	self.SendMsg(message.MSG_USER_INFO, &message.S2C_UserInfo{ UserInfo:self.getUserInfo()})
	//self.SendMsg(message.MSG_USER_INFO, nil)
}

// c-s 客户端请求获取当前游戏数据 用于中途入局时的数据同步
func (self *User) reqGetRoomInfo() {
	if self.room != nil {
		self.SendMsg(message.MSG_GET_ROOM_INFO, &message.S2C_Room{RoomInfo:self.room.getInfo()})
	}
}

// c-s 请求列出所有大厅数据
func (self *User) reqGetHallList() {
	data := &message.S2C_GetHallList{}
	for _, hall := range halls {
		data.Halls = append(data.Halls, hall.getHallInfo())
	}
	self.SendMsg(message.MSG_GET_HALL_LIST, data)
}

// c-s 请求说话(暂时只做房间内的聊天, playerID为0代表对所有人说话)
func (self *User) reqChat(msg string, targetID int) {
	if self.room != nil {
		self.room.broadcastChatMsg(msg, targetID, self.ID())
	}
}

// c-s 客户端调用该接口请求进入大厅，开始游戏（自动选择房间）
func (self *User) reqStartGame(hallID int) {
	log.Debug("%v reqStartGame: hall(%v  %v)", self.str(), hallID, self.hallID)

	// 如果发生异常情况，玩家已经在大厅里面，则先执行离开大厅的操作
	if self.hallID != 0 {
		log.Error("玩家已经在大厅中： %v", self.hallID)
		self.reqStopGame()
	}

	var hall *Hall
	if hallID == 0 {
		log.Debug("快速开始游戏： %v", self.str())
		hall = getFitHall(self)
		if hall == nil {
			self.onError(message.ErrorCode_ERR_NOT_ENOUGTH_MONEY)
			return
		} else {
			log.Debug("匹配大厅： %v", hall.hallID)
		}
	} else {
		// 进入大厅（直接查找房间开始游戏）
		hall = getHall(hallID)
	}

	if hall != nil {
		hall.onPlayerEnterHall(self, true)
	}

}

// c-s 客户端调用该接口请求停止游戏，返回到主界面，如果正在进行比赛，则做弃牌处理
func (self *User) reqStopGame() {
	// 还没有进入大厅
	if self.hallID == 0 {
		return
	}

	// 玩家离开当前房间（如果正在游戏则做弃牌处理）
	if self.room != nil {
		self.room.onPlayerLeaveRoom(self)
	}

	// 玩家离开大厅
	hall := getHall(self.hallID)
	if hall != nil {
		hall.onPlayerLeaveHall(self)
	}

	// 通知玩家离开房间
	if self.isOnline() {
		// 提示玩家赢了或者输了多少钱
		money := int(self.data.TotalMoney - self.totalMoneyBegin)
		self.SendMsg(message.MSG_LEAVE_HALL, &message.DataInt{Param:proto.Int(money)})
	}

	self.roomID = 0
	self.hallID = 0
	self.room = nil
}

// c-s 客户端请求进入指定房间
func (self *User) reqEnterRoom(roomID int) {
	room := getRoom(roomID)
	if room != nil {
		room.onPlayerEnterRoom(self, true, true)
	}
}

// c-s 客户端请求切换房间
func (self *User) reqChangeRoom() {
	if self.hallID == 0 {
		return
	}

	hall := getHall(self.hallID)
	if hall != nil {
		hall.onPlayerChangeRoom(self, self.roomID)
	}
}

// c-s 客户端请求开始游戏（pos为座位索引）
func (self *User) reqSitDown(pos int) {
	if self.room != nil {
		self.room.onPlayerSitDown(self, pos)
	}
}

// c-s 请求停止游戏
func (self *User) reqStandUp() {
	if self.room != nil {
		self.room.onPlayerStandUp(self)
	}
}

// c-s  客户端请求操作 只有加注时参数有用
func (self *User) reqAction(action message.PokerAction, param int) {
	if self.room != nil {
		self.room.onPlayerAction(self, action, param)
	}
}

// c-s 客户端请求亮牌
func (self *User) reqShowCard() {
	if self.room != nil {
		self.room.onPlayerShowCard(self)
	}
}

// 通知当前客户端，发生错误
func (self *User) onError(code message.ErrorCode) {
	self.SendError(message.MSG_ERROR, code)
}

// 处理玩家操作
func (self* User) handleAction(action message.PokerAction, param int32) {
	log.Debug("handleAction:  %v  %v  %v", self.data.Account, action, param)

}

// 获取玩家信息
func (self* User) getInfo() *message.GamePlayerInfo {
	info := new(message.GamePlayerInfo)
	info.PlayerID = proto.Int(self.ID())
	info.Name = proto.String(self.data.Name)
	info.Icon = proto.String(self.data.Icon)
	info.Money = proto.Int(self.money)
	info.Bet = proto.Int(self.bet)
	info.State = self.state.Enum()
	info.ThinkRemainTime = proto.Int(self.thinkTime)
	info.Seat = proto.Int(self.seat)
	info.Action = self.action.Enum()
	info.Param = proto.Int(self.actionParam)
	return info
}

// 回合开始时调用
func (self *User) beginTurn() {
	self.state = message.PlayerState_STATE_PLAYING
	self.handCard1 = nil
	self.handCard2 = nil
	self.thinkTime = 0
	self.sidePoolIndex = -1
	self.raiseCount = 0
	self.bet = 0
}

// 移除玩家，暂时只用在踢机器人的时候
func (self *User)killPlayer() {
	if self.hallID != 0 {
		hall := getHall(self.hallID)
		if hall != nil {
			hall.onPlayerLeaveHall(self)
		}
	}

	self.logout()
}
